import { getToken } from '@/utils/auth'
import request from '@/utils/request'

/**
 * 根据二进制流下载文件
 * @param {string} url - 下载接口地址
 * @param {string} fileName - 文件名（可选，如果不传会从响应头获取）
 * @param {object} params - 请求参数（可选）
 * @param {object} options - 额外配置（可选）
 */
export function downloadByStream(url, fileName = '', params = {}, options = {}) {
  return new Promise((resolve, reject) => {
    // 使用项目配置的request工具
    request({
      method: 'get',
      url: url,
      params: params,
      responseType: 'blob', // 关键：设置响应类型为 blob
      headers: {
        'Content-Type': 'application/json',
        ...options.headers,
      },
      timeout: 30000, // 30秒超时
      ...options,
    })
      .then(response => {
        // 获取文件名
        let downloadFileName = fileName
        if (!downloadFileName) {
          // 从响应头获取文件名
          const contentDisposition = response.headers['content-disposition']
          if (contentDisposition) {
            const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)
            if (fileNameMatch && fileNameMatch[1]) {
              downloadFileName = fileNameMatch[1].replace(/['"]/g, '')
              // 处理中文文件名编码
              downloadFileName = decodeURIComponent(downloadFileName)
            }
          }
        }

        // 如果还是没有文件名，生成一个默认的
        if (!downloadFileName) {
          const timestamp = new Date().getTime()
          downloadFileName = `download_${timestamp}`
        }

        // 创建下载
        downloadBlob(response.data, downloadFileName)
        resolve(response)
      })
      .catch(error => {
        console.error('下载文件失败:', error)
        reject(error)
      })
  })
}

/**
 * 通过 Blob 对象下载文件
 * @param {Blob} blob - 二进制数据
 * @param {string} fileName - 文件名
 */
export function downloadBlob(response) {
  // 从响应头中获取文件名
  const contentDisposition = response.headers['content-disposition']
  let fileName = 'default.zip'

  if (contentDisposition) {
    // 尝试多种文件名解析方式
    let extractedFileName = null
    if (!extractedFileName) {
      const quotedMatch = contentDisposition.match(/filename="([^"]+)"/)
      if (quotedMatch && quotedMatch[1]) {
        try {
          extractedFileName = decodeURIComponent(quotedMatch[1])
        } catch (e) {
          extractedFileName = quotedMatch[1]
        }
      }
    }
    if (extractedFileName) {
      fileName = extractedFileName
    }
  }

  // 创建blob对象
  const blob = new Blob([response.data], { type: 'application/zip' })

  // 创建下载链接并触发下载
  const url = window.URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.href = url
  a.download = fileName // 设置文件名
  document.body.appendChild(a)
  a.click()

  // 清理资源
  window.URL.revokeObjectURL(url)
  document.body.removeChild(a)
}

// 下载文件
export async function handleDownload(url, fileName = '') {
  try {
    // 方案1: 使用 fetch + blob 强制下载
    const urlSplice = `${import.meta.env.VITE_APP_FILE_BASE_URL}${url}`
    fetch(urlSplice, {
      headers: {
        Authorization: 'Bearer ' + getToken(),
      },
    })
      .then(response => response.blob())
      .then(blob => {
        const downloadUrl = window.URL.createObjectURL(blob)
        const link = document.createElement('a')
        link.href = downloadUrl
        link.download = getFileName(fileName)
        // 强制下载而不是预览
        link.setAttribute('download', getFileName(fileName))
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        // 释放内存
        window.URL.revokeObjectURL(downloadUrl)
      })
      .catch(error => {
        console.error('下载文件失败:', error)
        // 降级方案：添加下载参数
        window.open(url + '?download=true', '_blank')
      })
  } catch (error) {
    console.error('下载文件失败:', error)
  }
}

// 获取文件名称
function getFileName(name) {
  // 如果是url那么取最后的名字 如果不是直接返回
  if (name.lastIndexOf('/') > -1) {
    return name.slice(name.lastIndexOf('/') + 1)
  } else {
    return name
  }
}
